﻿#include "printercontrol.h"

PrinterControl::PrinterControl(QObject *parent)
    : QObject{parent}
{
    m_Serial = new QSerialPort(this);
}

void PrinterControl::setConnectParameter(QString serialport, QString baudrate, QString databit, QString paritybit, QString stopbit)
{
    QSerialPort::BaudRate set_BaudRate;
    QSerialPort::DataBits set_DataBit;
    QSerialPort::Parity   set_ParityBit;
    QSerialPort::StopBits set_StopBit;

    // 设置 - 波特率
    if("115200" == baudrate){
        set_BaudRate = QSerialPort::Baud115200;
    }else if("57600" == baudrate){
        set_BaudRate = QSerialPort::Baud57600;
    }else if("38400" == baudrate){
        set_BaudRate = QSerialPort::Baud38400;
    }else if("19200" == baudrate){
        set_BaudRate = QSerialPort::Baud19200;
    }else if("9600" == baudrate){
        set_BaudRate = QSerialPort::Baud9600;
    }else if("4800" == baudrate){
        set_BaudRate = QSerialPort::Baud4800;
    }else if("2400" == baudrate){
        set_BaudRate = QSerialPort::Baud2400;
    }else {
        set_BaudRate = QSerialPort::Baud1200;
    }

    // 设置 - 数据位
    if("8" == databit){
        set_DataBit = QSerialPort::Data8;
    }else if("7" == databit){
        set_DataBit = QSerialPort::Data7;
    }else if("6" == databit){
        set_DataBit = QSerialPort::Data6;
    }else {
        set_DataBit = QSerialPort::Data5;
    }

    // 设置 - 校验位
    if("None" == paritybit){
        set_ParityBit = QSerialPort::NoParity;
    }else if("Even" == paritybit){
        set_ParityBit = QSerialPort::EvenParity;
    }else if("Odd" == paritybit){
        set_ParityBit = QSerialPort::OddParity;
    }else if("Mark" == paritybit){
        set_ParityBit = QSerialPort::MarkParity;
    }else {
        set_ParityBit = QSerialPort::SpaceParity;
    }

    // 设置 - 停止位
    if("1" == stopbit){
        set_StopBit = QSerialPort::OneStop;
    }else if("1.5" == stopbit){
        set_StopBit = QSerialPort::OneAndHalfStop;
    }else{
        set_StopBit = QSerialPort::TwoStop;
    }

    m_Serial->setPortName(serialport);
    m_Serial->setBaudRate(set_BaudRate);
    m_Serial->setDataBits(set_DataBit);
    m_Serial->setParity(set_ParityBit);
    m_Serial->setStopBits(set_StopBit);

}

void PrinterControl::connectMethod()
{
    if(m_Serial->open(QIODevice::ReadWrite))
    {
        qDebug()<<"Cpp : 打印机 连接成功";

    }
    else
    {
        qDebug()<<"Cpp : 打印机 连接失败";
    }
}

// 瑞工打印机 - 打印方法
void PrinterControl::printerMethod_RG(QString qmlLength,
                                      QString qmlHeight,
                                      QString qmlLeftAngle,
                                      QString qmlRightAngle,
                                      QString qmlCustomName,
                                      QString qmlMaterialName)
{
    // 打印指令
    QByteArray printResult;

    QString printerMechineSet = QString::fromLocal8Bit("1B401B63001B732B40");
    // 打印机设置 [初始化,禁止反向打印,加深]

    QString recvParameter = QString("型材长度:%1,左角度:%2,右角度:%3").arg(qmlLength).arg(qmlLeftAngle).arg(qmlRightAngle);

    // 将接收到的数据转换为 16位UTF-8格式
    QString handleParameter = recvParameter.toUtf8().toHex();
    // QString handleParameter = recvParameter.toLocal8Bit().toHex();
    // 获取字符串长度
    int parameterLength = QString::number(handleParameter.size() / 2).toInt();
    // 将字符串长度转换为16进制
    QString QR_ParameterLength = QString("%1").arg(parameterLength,2,16,QLatin1Char('0'));

    QString QR_print = QString::fromLocal8Bit("1D6CDC0032001D57041D6E200601%1%2").arg(handleParameter).arg("00");
    // 二维码打印设定 [设置打印位置 横向220 竖向50 , 二维码放大倍数 04 , 二维码打印内容]


    QString printWordSet = QString::fromLocal8Bit("1B2400001B57010D");
    // 文字打印位置设置 [第一行位置 00 00 ， 放大倍数 1 倍]
    QString printMethod = QString::fromLocal8Bit("1B69");

    // 打印字符 型材长度 拼接
    QString recvQmlmaterialLength = QString("长度:%1\n").arg(qmlLength);
    // 打印字符 型材高度 拼接
    QString recvQmlmaterialHeight = QString("高度:%1\n").arg(qmlHeight);
    // 打印字符 左角度 拼接
    QString recvQmlLeftAngle = QString("左角度:%1\n").arg(qmlLeftAngle);
    // 打印字符 右角度 拼接
    QString recvQmlRightAngle = QString("右角度:%1\n").arg(qmlRightAngle);
    // 打印字符 客户名称 拼接
    QString recvQmlCustomName = QString("客户名称:\n%1\n").arg(qmlCustomName);
    // 打印字符 型材名称 拼接
    QString recvQmlMaterialName = QString("型材名称:\n%1\n").arg(qmlMaterialName);

    // 将接收到的字符串转换为 16位GBK格式
    QString handlmaterialLength = recvQmlmaterialLength.toLocal8Bit().toHex();
    QString handlematerialHeight = recvQmlmaterialHeight.toLocal8Bit().toHex();
    QString handleLeftAngle = recvQmlLeftAngle.toLocal8Bit().toHex();
    QString handleRightAngle = recvQmlRightAngle.toLocal8Bit().toHex();
    QString handleCustomName = recvQmlCustomName.toLocal8Bit().toHex();
    QString handleMaterialName = recvQmlMaterialName.toLocal8Bit().toHex();

    printResult = printerMechineSet.toUtf8() +
                  QR_print.toUtf8() +
                  printWordSet.toUtf8() +
                  handlmaterialLength.toUtf8() +
                  handlematerialHeight.toUtf8() +
                  handleLeftAngle.toUtf8() +
                  handleRightAngle.toUtf8() +
                  handleCustomName.toUtf8() +
                  handleMaterialName.toUtf8() +
                  printMethod.toUtf8();

    // qDebug()<<"瑞工 - 最终打印结果:  "<<printResult;


    QByteArray sendMasage = QByteArray::fromHex(printResult);

    if(m_Serial->write(sendMasage))	// 使用串口写入数据
    {
        qDebug()<<"发送成功";
    }
    else
    {
        qDebug()<<"发送失败";
    }
}
// 炜煌打印机 - 打印方法
void PrinterControl::printerMethod_WH(QString qmlLength,
                                      QString qmlHeight,
                                      QString qmlLeftAngle,
                                      QString qmlRightAngle,
                                      QString qmlCustomName,
                                      QString qmlMaterialName)
{
    QByteArray printResult;

    QString printWordSet = QString::fromLocal8Bit("1B401B6330021B4C1B54001B57000000008001640118");
    // 打印字符设置 [初始化、设置纸张为标签纸、页模式、打印方向从左到右、设置打印区域、刷新缓存]
    QString printMethod = QString::fromLocal8Bit("0C");
    // 打印命令

    // 客户公司名称 位置   [横向 0 位置 纵向 0  位置]
    QString printWord01Set = QString::fromLocal8Bit("1B2400001D240000");
    // 型材名称 位置   [横向 0 位置 纵向 30  位置]
    QString printWord02Set = QString::fromLocal8Bit("1B2400001D241E00");
    // 型材编号 位置   [横向 0 位置 纵向 60  位置]
    QString printWord03Set = QString::fromLocal8Bit("1B2400001D243C00");
    // 型材长度 位置   [横向 0 位置 纵向 90  位置]
    QString printWord04Set = QString::fromLocal8Bit("1B2400001D245A00");
    // 料高 设置       [横向 0 位置 纵向 120 位置]
    QString printWord05Set = QString::fromLocal8Bit("1B2400001D247800");
    // 左摆角 设置      [横向 0 位置 纵向 150 位置]
    QString printWord06Set = QString::fromLocal8Bit("1B2400001D249600");
    // 右摆角 设置      [横向 0 位置 纵向 180 位置]
    QString printWord07Set = QString::fromLocal8Bit("1B2400001D24B400");
    // 右摆角 设置      [横向 0 位置 纵向 210 位置]
    QString printWord08Set = QString::fromLocal8Bit("1B2400001D24D200");

    // 打印字符 型材长度 拼接
    QString recvQmlLength = QString("长度:%1\n").arg(qmlLength);
    // 打印字符 型材高度 拼接
    QString recvQmlHeight = QString("高度:%1\n").arg(qmlHeight);
    // 打印字符 左角度 拼接
    QString recvQmlLeftAngle = QString("左角度:%1\n").arg(qmlLeftAngle);
    // 打印字符 右角度 拼接
    QString recvQmlRightAngle = QString("右角度:%1\n").arg(qmlRightAngle);
    // 打印字符 客户名称 拼接
    QString recvQmlCustomName = QString("%1\n").arg(qmlCustomName);
    // 打印字符 型材名称 拼接
    QString recvQmlMaterialName = QString("%1\n").arg(qmlMaterialName);
    // 打印字符 右摆角 拼接
    // QString recvQmlrightAngle = QString("右摆角:%1\n").arg(rightAngle);

    // 将接收到的字符串转换为 16位GBK格式
    QString handleLength = recvQmlLength.toLocal8Bit().toHex();
    QString handleHeight = recvQmlHeight.toLocal8Bit().toHex();
    QString handleLeftAngle = recvQmlLeftAngle.toLocal8Bit().toHex();
    QString handleRightAngle = recvQmlRightAngle.toLocal8Bit().toHex();
    QString costomTitle = QString("客户名称:").toLocal8Bit().toHex();
    QString materialTitle = QString("型材名称:").toLocal8Bit().toHex();
    QString handleCustomName = recvQmlCustomName.toLocal8Bit().toHex();
    QString handleMaterialName = recvQmlMaterialName.toLocal8Bit().toHex();
    // QString handlerightAngle = recvQmlrightAngle.toLocal8Bit().toHex();

    // 将接收到的数据进行拼接  --  11轴复合机加工参数
    // QString recvParameter = QString("%1,%2,%3,%4,%5,%6,%7,%8,%9,%10,%11")
    //                             .arg(knife).arg(roller)
    //                             .arg(stress01).arg(stress02).arg(stress03)
    //                             .arg(fwdknife01).arg(fwdknife02).arg(fwdknife03)
    //                             .arg(backknife01).arg(backknife02).arg(backknife03);

    // 数控锯 - 二维码数据 型材长度 左角度 右角度
    QString recvParameter = QString("%1,%2,%3")
                                .arg(qmlLength)
                                .arg(qmlLeftAngle)
                                .arg(qmlRightAngle);

    // 将接收到的数据转换为 16位UTF-8格式
    QString handleParameter = recvParameter.toUtf8().toHex();
    // 获取字符串长度
    int parameterLength = QString::number(handleParameter.size() / 2).toInt();
    // 将字符串长度转换为16进制
    QString QR_ParameterLength = QString("%1").arg(parameterLength,2,16,QLatin1Char('0'));
    // 设置打印二维码的位置，匹配打印长度
    QString printerQRCodeSet = QString::fromLocal8Bit("1B24C8001D2400001B5A000005%1%2").arg(QR_ParameterLength).arg("00");
    //

    // 打印指令拼接
    printResult = printWordSet.toUtf8() +
                  printWord01Set.toUtf8() + handleLength.toUtf8() +
                  printWord02Set.toUtf8() + handleHeight.toUtf8() +
                  printWord03Set.toUtf8() + handleLeftAngle.toUtf8() +
                  printWord04Set.toUtf8() + handleRightAngle.toUtf8() +
                  printWord05Set.toUtf8() + costomTitle.toUtf8() +
                  printWord06Set.toUtf8() + handleCustomName.toUtf8() +
                  printWord07Set.toUtf8() + materialTitle.toUtf8() +
                  printWord08Set.toUtf8() + handleMaterialName.toUtf8() +
                  printerQRCodeSet.toUtf8() + handleParameter.toUtf8() +
                  printMethod.toUtf8();


    QByteArray sendMasage = QByteArray::fromHex(printResult);

    if(m_Serial->write(sendMasage))	// 使用串口写入数据
    {
        qDebug()<<"发送成功";
    }
    else
    {
        qDebug()<<"发送失败";
    }
}
